
/*******************************************************************************
 * Copyleft (c) 2021 Kcode
 *
 * @file    convert_manager.c
 * @brief   转换视频数据管理者文件
 * @author  K
 * @version 0.0.1
 * @date    2021-07-26
 * @license MulanPSL-1.0
 *
 * 文件修改历史：
 * <时间>       | <版本>    | <作者>  | <描述>
 * 2021-07-27   | v0.0.1    | Kcode   | 转换视频数据管理者文件
 * -----------------------------------------------------------------------------
 ******************************************************************************/

#include <string.h>

#include "config.h"
#include "convert_manager.h"
#include "debug_manager.h"

static PT_VIDEOCONVERTOPR s_ptConvertOprHead = NULL; /**< 支持设备链表头 */
 
/*!
 * @brief  注册函数
 * @return 0：成功 -1：失败
 */
int RegisterVideoConvertOpr(PT_VIDEOCONVERTOPR ptConvertOpr)
{
    PT_VIDEOCONVERTOPR ptTmp;

    if (!s_ptConvertOprHead)
    {
        s_ptConvertOprHead   = ptConvertOpr;
        ptConvertOpr->ptNext = NULL;
    }
    else
    {
        ptTmp = s_ptConvertOprHead;
        while (ptTmp->ptNext)
            ptTmp = ptTmp->ptNext;
        
        ptTmp->ptNext     = ptConvertOpr;
        ptConvertOpr->ptNext = NULL;
    }

 return 0;
}
 
/*!
 * @brief  显示所支持的设备
 */
void ShowVideoConvertOpr(void)
{
    int i = 0;
    PT_VIDEOCONVERTOPR ptTmp = s_ptConvertOprHead;
 
    while (ptTmp)
    {
        printf("%02d %s\n", i++, ptTmp->name);
        ptTmp = ptTmp->ptNext;
    }
}
 
/*!
 * @brief  根据name得到指定的设备文件
 * @return  成功：返回设备的结构体指针 失败：返回空指针
 */
PT_VIDEOCONVERTOPR GetVideoConvertOpr(char *pName)
{
    PT_VIDEOCONVERTOPR ptTmp = s_ptConvertOprHead;

    while (ptTmp)
    {
        if (strcmp(ptTmp->name, pName) == 0)
            return ptTmp;

        ptTmp = ptTmp->ptNext;
    }
    
    return NULL;
}

/*!
 * @brief  获取支持格式的转换处理结构体
 * @return  0：获取失败 1：成功
 */
PT_VIDEOCONVERTOPR GetVIdeoConvertForFormats(int pixel_format_in,
                                            int pixel_format_out)
{
    int ret;
    PT_VIDEOCONVERTOPR ptTmp = s_ptConvertOprHead;

    while (ptTmp)
    {
        ret = ptTmp->isSupport(pixel_format_in, pixel_format_out);
        if (ret)
            return ptTmp;
        
        ptTmp = ptTmp->ptNext;
    }

    return 0;
}

/*!
 * @brief  初始化函数，把对支持的各个设备进行初始化工作
 *         对应的结构体放入链表统一管理
 * @return  0：初始化成功 1：失败
 */
int VideoConvertInit(void)
{
    int error;

    error = Yuv2RgbInit();
    error |= Rgb2RgbInit();
    error |= Mjpeg2RgbInit();
    if (error)
    {
        DBG_PRINTF(APP_ERR"VideoConvertInit error!\n");
        return -1;
    }

    return 0;
}
 
